#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <sstream>
#include <math.h>
#include <random>

#define PARED 0
#define PISO 1
#define VIP 2

int main(int argc, char* argv[]) {
	// Falta el archivo
	if( argc < 6 ) {
		printf(" 1) Output valido\n 2) Cantidad de filas\n 3) Cantidad de columnas\n 4) Porcentaje de pared\n 5) Cantidad de celdas importantes\n");
		return -1; 
	}

	// Abro el archivo
	const char* archivoOut = argv[1];
	int cantFilas = atoi(argv[2]);
	int cantColumnas = atoi(argv[3]);
	int porcentajePared = atoi(argv[4]);
	int celdasImportantes = atoi(argv[5]);
	
	int celdasTotales = cantFilas * cantColumnas;
	int celdasParaPared = (porcentajePared * celdasTotales) / 100;
	
	if (celdasParaPared > celdasTotales) {
		printf("Los valores de entrada son incoherentes\n");
		return -1;
	}
	
	printf("Generando\n");
	srand(time(NULL));

	//~  -----------------------------------------------------
	//~ CREAMOS EL PISO 
	int piso[cantFilas][cantColumnas];
	for (int m=0; m < cantFilas; m++) {
		for (int n=0; n < cantColumnas; n++) {
			piso[m][n] = PISO;
		}
	}
	int m = 0;
	int fila, columna;
	
	//~ COLOCAMOS PSEUDO-ALEATORIAMENTE LAS CELDAS IMPORTANTES
	while (m < celdasImportantes) {
		fila = rand() % cantFilas;
		columna = rand() % cantColumnas;
		
		if (piso[fila][columna] == PISO) {
			piso[fila][columna] = VIP;
			m++;
		}
	}
	m = 0;
	int n = 0;
	int cant = 0;
	
	// UBICAMOS LAS PAREDES EN EL SUELO
	while (m < celdasParaPared) {
		// ELEGIMOS UNA CELDA
		fila = rand() % cantFilas;
		columna = rand() % cantColumnas;
		if (piso[fila][columna] == PISO) {
			piso[fila][columna] == PARED;
		} else {
			break;
		}
		
		// UBICAMOS PAREDES ABAJO DE LA COLUMNA ACTUAL
		n = fila+1;
		while (n < cantFilas && piso[n][columna] == PISO) {
			cant++;
			n++;
		}
		
		if (cant == 0) {
			n = 0;
		} else {
			cant = rand() % cant;
			n = cant;
		}
		
		while (cant > 0) {
			piso[fila+n][columna] = PARED;
			cant--;
		}
		m = m+n;
		
		// UBICAMOS PAREDES ARRIBA DE LA COLUMNA ACTUAL
		n = fila-1;
		while (n >= 0 && piso[n][columna] == PISO) {
			cant++;
			n--;
		}
		
		if (cant == 0) {
			n = 0;
		} else {
			cant = rand() % cant;
			n = cant;
		}
		
		while (cant > 0) {
			piso[fila-n][columna] = PARED;
			cant--;
		}
		m = m+n;
		
		// UBICAMOS PAREDES A LA IZQUIERDA DE LA FILA ACTUAL
		n = columna-1;
		while (n >= 0 && piso[fila][n] == PISO) {
			cant++;
			n--;
		}
		
		if (cant == 0) {
			n = 0;
		} else {
			cant = rand() % cant;
			n = cant;
		}
		
		while (cant > 0) {
			piso[fila][columna-n] = PARED;
			cant--;
		}
		m = m+n;
		
		// UBICAMOS PAREDES A LA DERECHA DE LA FILA ACTUAL
		n = columna+1;
		while (n >= 0 && piso[fila][n] == PISO) {
			cant++;
			n++;
		}
		
		if (cant == 0) {
			n = 0;
		} else {
			cant = rand() % cant;
			n = cant;
		}
		
		while (cant > 0) {
			piso[fila][columna+n] = PARED;
			cant--;
		}
		m = m+n;
	}
	
	//~ -----------------------------------------------------		
	
	
	FILE* archivo = fopen(archivoOut, "a" );
	fprintf(archivo, "%i %i \n", cantFilas, cantColumnas);
	
	for (int i=0; i < cantFilas; i++) {
		for (int j=0; j < cantColumnas; j++) {
			fprintf(archivo, "%i ", piso[i][j]);
		}
		fprintf(archivo, "\n");
	}
	
	fprintf(archivo, "#");
	fclose(archivo);
	
	printf("Archivo generado\n");
	return 0;
}


